package com.zc.websocket;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

/**
 * @description:
 * @author: cong
 * @create: 2025/3/12
 */
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer {
    /**
     * 配置并注册STOMP协议的端点
     *
     * 该方法用于定义和注册应用程序中使用的WebSocket端点它特别适用于基于STOMP协议的WebSocket应用程序
     * 通过这个方法，我们可以指定用于WebSocket连接的URL路径，并配置允许的跨域请求来源此外，还可以选择性地启用SockJS协议，以支持不直接支持WebSocket的浏览器或环境
     *
     * @param registry StompEndpointRegistry实例，用于注册WebSocket端点
     *                 这个参数是由Spring框架提供给方法实现者使用的，用于配置和注册WebSocket端点
     */
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        // 注册一个路径为/ws的WebSocket端点，允许所有域的跨域请求，并启用SockJS支持
        registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();
    }

    /**
     * 配置消息代理的方法
     * 该方法用于设置消息代理的路径和应用目标前缀
     *
     * @param registry 消息代理注册表，用于配置消息代理的属性
     */
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        // 启用简单的内存消息代理，处理以"/topic"或"queue"开头的路径
        registry.enableSimpleBroker("/topic", "queue");
        // 设置应用目标的前缀为"/app"，用于识别应用发送的消息
        registry.setApplicationDestinationPrefixes("/app");
    }
}
